package menagementBean;

import java.util.ArrayList;
import java.util.List;

import javax.annotation.security.RolesAllowed;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import entities.Escursione;
import entities.Escursione_In_Pacchetto;
import entities.Group;
import entities.Hotel;
import entities.Pacchetto;
import entities.Prenotazione;
import entities.Volo;
import menagement.ProdottoBaseMgr;
import menagement.dto.EscursioneDTO;
import menagement.dto.EscursioniPacchettoDTO;
import menagement.dto.HotelDTO;
import menagement.dto.PrenotazioneDTO;
import menagement.dto.VoloDTO;


@Stateless
public class ProdottoBaseMgrBean implements ProdottoBaseMgr {
	@PersistenceContext
    private EntityManager em;
	
	@Override
	public void save(EscursioneDTO escursione){
		Escursione newEscursione= new Escursione(escursione);
		newEscursione.setValido(true);
		em.persist(newEscursione);
	}
	@Override
	@RolesAllowed({Group._USER,Group._ADMIN})
	public void update(EscursioneDTO escursione) {
		Escursione e = em.find(Escursione.class, escursione.getCodice());
	    if(e==null){
	        throw new IllegalArgumentException("NON ESISTE IN DB UNA ESCURSIONE CON IL CODICE DELLA MODIFICA");
	    }
	    e.setCodice(escursione.getCodice());
	    e.setDurata(escursione.getDurata());
	    e.setLuogoPartenza(escursione.getLuogoPartenza());
	    e.setPrezzo(escursione.getPrezzo());
	    e.setStagione(escursione.getStagione());
	    e.setTipologia(escursione.getTipologia());
	    e.setNome(escursione.getNome());
	}
	
	@Override
	public void save(VoloDTO volo){
		Volo newVolo=new Volo(volo);
		newVolo.setValido(true);
		em.persist(newVolo);
	}
	@Override
	@RolesAllowed({Group._USER,Group._ADMIN})
	public void update(VoloDTO volo) {
		Volo v = em.find(Volo.class, volo.getCodice());
	    if(v==null){
	        throw new IllegalArgumentException("NON ESISTE IN DB UN VOLO CON IL CODICE DELLA MODIFICA");
	    }
	    v.setCodice(volo.getCodice());
	    v.setAeroportoArrivo(volo.getAeroportoArrivo());
	    v.setAeroportoPartenza(volo.getAeroportoPartenza());
	    v.setCittaArrivo(volo.getCittaArrivo());
	    v.setCittaPartenza(volo.getCittaPartenza());
	    v.setData(volo.getData());
	    v.setDurata(volo.getDurata());
	    v.setPosti_Disponibili(volo.getPosti_Disponibili());
	    v.setPrezzo(volo.getPrezzo());
	    v.setDataRitorno(volo.getDataRitorno());
	}
	
	@Override
	public void save(HotelDTO hotel){
		Hotel newHotel= new Hotel(hotel);
		newHotel.setValido(true);
		em.persist(newHotel);
	}
	@Override
	@RolesAllowed({Group._USER,Group._ADMIN})
	public void update(HotelDTO hotel) {
		Hotel h = em.find(Hotel.class, hotel.getCodice());
	    if(h==null){
	        throw new IllegalArgumentException("NON ESISTE IN DB UN HOTEL CON IL CODICE DELLA MODIFICA");
	    }
	    h.setCodice(hotel.getCodice());
	    h.setIndirizzo(hotel.getIndirizzo());
	    h.setMail(hotel.getMail());
	    h.setN_Stelle(hotel.getN_Stelle());
	    h.setStanze_Disponibili(hotel.getStanze_Disponibili());
	    h.setTelefono(hotel.getTelefono());
	    h.setCitta(hotel.getCitta());
	    h.setNome(hotel.getNome());
	    h.setPrezzo(hotel.getPrezzo());
	}
	
	@Override
	public ArrayList <VoloDTO> trovaVoli(){
		Query q=em.createNamedQuery("Volo.findAll");
		List<Volo> listaVoli =  (List<Volo>) q.getResultList();
		ArrayList<VoloDTO> listaV= new ArrayList<VoloDTO>();
		
		for(int i=0; i<listaVoli.size();i++){
			VoloDTO volo= new VoloDTO();
			
			volo.setAeroportoPartenza(listaVoli.get(i).getAeroportoPartenza());
			volo.setAeroportoArrivo(listaVoli.get(i).getAeroportoArrivo());
			volo.setData(listaVoli.get(i).getData());
			volo.setDurata(listaVoli.get(i).getDurata());
			volo.setPosti_Disponibili(listaVoli.get(i).getPosti_Disponibili());
			volo.setPrezzo(listaVoli.get(i).getPrezzo());
			volo.setCittaPartenza(listaVoli.get(i).getCittaPartenza());
			volo.setCittaArrivo(listaVoli.get(i).getCittaArrivo());
			volo.setCodice(listaVoli.get(i).getCodice());
			volo.setValido(listaVoli.get(i).isValido());
			volo.setDataRitorno(listaVoli.get(i).getDataRitorno());
			
			listaV.add(volo);
		}
		
		return listaV;
	}
	
	@Override
	public ArrayList <EscursioneDTO> trovaEscursioni(){
		Query q=em.createNamedQuery("Escursione.findAll");
		List<Escursione> ListaEscursioni =  (List<Escursione>) q.getResultList();
		ArrayList<EscursioneDTO> listaE= new ArrayList<EscursioneDTO>();
		
		for(int i=0; i<ListaEscursioni.size();i++){
			EscursioneDTO escursione = new EscursioneDTO();
			
			escursione.setNome(ListaEscursioni.get(i).getNome());
			escursione.setCodice(ListaEscursioni.get(i).getCodice());
			escursione.setDurata(ListaEscursioni.get(i).getDurata());
			escursione.setLuogoPartenza(ListaEscursioni.get(i).getLuogoPartenza());
			escursione.setPrezzo(ListaEscursioni.get(i).getPrezzo());
			escursione.setStagione(ListaEscursioni.get(i).getStagione());
			escursione.setTipologia(ListaEscursioni.get(i).getTipologia());

			listaE.add(escursione);
		}
		
		return listaE;
	}
	
	@Override
	public ArrayList <HotelDTO> trovaHotel(){
		Query q=em.createNamedQuery("Hotel.findAll");
		List<Hotel> ListaHotel =  (List<Hotel>) q.getResultList();
		ArrayList<HotelDTO> listaH= new ArrayList<HotelDTO>();
		
		for(int i=0; i<ListaHotel.size();i++){
			HotelDTO hotel = new HotelDTO();
			
			hotel.setNome(ListaHotel.get(i).getNome());
			hotel.setCodice(ListaHotel.get(i).getCodice());
			hotel.setIndirizzo(ListaHotel.get(i).getIndirizzo());
			hotel.setMail(ListaHotel.get(i).getMail());
			hotel.setN_Stelle(ListaHotel.get(i).getN_Stelle());
			hotel.setPrezzo(ListaHotel.get(i).getPrezzo());
			hotel.setStanze_Disponibili(ListaHotel.get(i).getStanze_Disponibili());
			hotel.setTelefono(ListaHotel.get(i).getTelefono());
			hotel.setCitta(ListaHotel.get(i).getCitta());

			listaH.add(hotel);
		}
		
		return listaH;
	}
	@Override
	public void delete(HotelDTO hotel){
		Hotel h = em.find(Hotel.class, hotel.getCodice());
		if(h==null){
	        throw new IllegalArgumentException("NON ESISTE IN DB UN HOTEL CON IL CODICE DELLA MODIFICA");
	    }
		h.setValido(false);
	}
	@Override
	public void delete(EscursioneDTO escursione){
		Escursione e = em.find(Escursione.class, escursione.getCodice());
		if(e==null){
	        throw new IllegalArgumentException("NON ESISTE IN DB UNA ESCURSIONE CON IL CODICE DELLA MODIFICA");
	    }
		e.setValido(false);
	}
	@Override
	public void delete(VoloDTO volo){
		Volo v = em.find(Volo.class, volo.getCodice());
		if(v==null){
	        throw new IllegalArgumentException("NON ESISTE IN DB UN VOLO CON IL CODICE DELLA MODIFICA");
	    }
		v.setValido(false);
	}
}
